{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5 计算和控制流（一）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.打印一定范围内的水仙花数：水仙花数是指一个n位数 (n≥3)，它的每个位上的数字的n次幂之和等于它本身。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "水仙花数是指一个n位数 (n≥3)，它的每个位上的数字的n次幂之和等于它本身。\n",
    "\n",
    "例如：153是一个“水仙花数”，因为 153 是个 3位数，而1\\*\\*3+5\\*\\*3+3\\*\\*3==153。\n",
    "\n",
    "输入一个正整数max，输出100到max之间的所有水仙花数（包括max）。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，为一个正整数。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "若干行，从小到大输出水仙花数，一行为一个数。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "2500\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "153\n",
    "\n",
    "370\n",
    "\n",
    "371\n",
    "\n",
    "407\n",
    "\n",
    "1634\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 2500\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "153\n",
      "370\n",
      "371\n",
      "407\n",
      "1634\n"
     ]
    }
   ],
   "source": [
    "num_max = int(input())\n",
    "\n",
    "for i in range(100, num_max+1):\n",
    "    count = 0  # 计算数字的位数\n",
    "    tmp1 = i\n",
    "    tmp2 = i\n",
    "    num = []   # 存放各位上的数字\n",
    "    total = 0  # 求和\n",
    "    \n",
    "    # 求位数\n",
    "    while tmp1 != 0:\n",
    "        tmp1 //= 10\n",
    "        count += 1\n",
    "        \n",
    "    # 求各位上的数字\n",
    "    for j in range(count):\n",
    "        last = tmp2 % 10\n",
    "        num.append(last)\n",
    "        tmp2 = tmp2 // 10\n",
    "    \n",
    "    # 求各位数的 count 次幂之和\n",
    "    total = sum(list(map(lambda x: x ** count, num)))\n",
    "    \n",
    "    # 判断是否满足“水仙花数”的要求\n",
    "    if total == i:\n",
    "        print(i)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.输入两个字符串，输出两个字符串集合的并集。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "输入两个字符串，输出两个字符串集合的并集。\n",
    "\n",
    "为保证输出结果一致，请将集合内元素排序之后再输出，\n",
    "\n",
    "如对于集合aset，可输出sorted(aset)。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共两行，每一行为一个字符串\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，为一个集合\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "abc\n",
    "\n",
    "bcd\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "['a', 'b', 'c', 'd']\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " abc\n",
      " bcd\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['a', 'b', 'c', 'd']\n"
     ]
    }
   ],
   "source": [
    "aset = set(input())\n",
    "bset = set(input())\n",
    "\n",
    "cset = aset | bset  # 并集运算\n",
    "print(sorted(cset))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.与7相关的数：如果一个正整数，它能被7整除或者它的十进制表示法中某个位数上的数字为7，则称之为与7相关的数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在我们给定一个正整数n（n<1000），求所有小于等于n的与7无关的正整数的平方和。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，为一个正整数。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，为一个正整数。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "50\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "31469\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "31469\n"
     ]
    }
   ],
   "source": [
    "num_max = int(input())\n",
    "square_sum = 0  # 求平方和\n",
    "\n",
    "for i in range(1, num_max+1):\n",
    "    count = 0  # 计算数字的位数\n",
    "    tmp1 = i\n",
    "    tmp2 = i\n",
    "    num = []   # 存放各位上的数字\n",
    "    \n",
    "    # 求位数\n",
    "    while tmp1 != 0:\n",
    "        tmp1 //= 10\n",
    "        count += 1\n",
    "        \n",
    "    # 求各位上的数字\n",
    "    for j in range(count):\n",
    "        last = tmp2 % 10\n",
    "        num.append(last)\n",
    "        tmp2 = tmp2 // 10\n",
    "    \n",
    "    # 判断满足“与7无关的数”所满足的条件\n",
    "    if (i % 7 != 0) and (not 7 in num):\n",
    "        square_sum += i ** 2\n",
    "\n",
    "print(square_sum)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.打印完数：一个数如果恰好等于它的因子之和，这个数就称为\"完数\"。例如 6 = 1＋2＋3。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "输入一个正整数n（n<1000），输出1到n之间的所有完数（包括n）。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，为一个正整数。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "若干行，从小到大输出完数，一行为一个数。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "30\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "6\n",
    "\n",
    "28\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 10000\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6\n",
      "28\n",
      "496\n",
      "8128\n"
     ]
    }
   ],
   "source": [
    "num_max = int(input())\n",
    "\n",
    "for i in range(1, num_max+1):\n",
    "    factor = set()  # 利用集合存放因子（集合元素的不重复性）\n",
    "    \n",
    "    # 求因子\n",
    "    for j in range(1, i):\n",
    "        tmp = i // j\n",
    "        if j > tmp:  # 不用遍历所有来寻找因子\n",
    "            break\n",
    "        elif tmp * j == i:\n",
    "            factor.add(j)\n",
    "            factor.add(tmp)\n",
    "    \n",
    "    factor.discard(i)  # 去除该数字本身\n",
    "    \n",
    "    # 判断是否满足“完数”条件\n",
    "    if sum(factor) == i:\n",
    "        print(i)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5.打印一个n层金字塔"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "打印一个n层（1<n<20）金字塔，金字塔由“+”构成，塔尖是1个“+”，下一层是3个“+”，居中排列，以此类推。\n",
    "\n",
    "> 注意：每一行的+号之后均无空格，最后一行没有空格。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "一个正整数n（1<n<20）\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "一个由+号构成的n层金字塔\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "3\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```shell\n",
    "  +\n",
    " +++\n",
    "+++++\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 4\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   +\n",
      "  +++\n",
      " +++++\n",
      "+++++++\n"
     ]
    }
   ],
   "source": [
    "n = int(input())\n",
    "\n",
    "for i in range(n):\n",
    "    print(' ' * (n-1-i) + '+' * (2*(i+1)-1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6.回文数判断"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "给一个5位数，判断它是不是回文数，是则输出yes，不是则输出no。\n",
    "\n",
    "例如12321是回文数，它的个位与万位相同，十位与千位相同。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，为一个5位数。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，yes或no。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "12321\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "yes\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 15645\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "no\n"
     ]
    }
   ],
   "source": [
    "# 这题已经非常降低难度了，只需要考虑 5 位数的情况\n",
    "\n",
    "n = list(input())\n",
    "if (n[0] == n[4]) and (n[1] == n[3]):\n",
    "    print('yes')\n",
    "else:\n",
    "    print('no')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*如果考虑更一般的情况呢？* 即判断任意位数的数字是否为回文数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 1236556321\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "yes\n"
     ]
    }
   ],
   "source": [
    "n = list(input())\n",
    "n_len = len(n)\n",
    "\n",
    "middle = n_len // 2  # 中间位置\n",
    "flag = 0  # 标志位\n",
    "\n",
    "for i in range(middle):\n",
    "    if n[i] == n[n_len - 1 - i]:\n",
    "        flag = 1\n",
    "    else:\n",
    "        flag = 0\n",
    "        break\n",
    "        \n",
    "if flag == 1:\n",
    "    print('yes')\n",
    "else:\n",
    "    print('no')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7.列表元素改写"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "输入一个列表alist，要求列表中的每个元素都为正整数且不超过10；\n",
    "\n",
    "将列表中的奇数变为它的平方，偶数除以2后打印新的列表（新的列表中所有元素仍都为整数）。\n",
    "\n",
    "可以使用以下实现列表alist的输入：\n",
    "\n",
    "`alist=list(map(int,input().split()))`同时为保证输出结果一致，请将集合内元素排序之后再输出。\n",
    "\n",
    "如对于列表alist，可输出`sorted(alist)`。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，用来输入列表的元素值，以空格隔开。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，以列表形式打印输出。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "1 2 3 4\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "[1,1,2,9]\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 1 2 3 4\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 1, 2, 9]\n"
     ]
    }
   ],
   "source": [
    "alist = list(map(int,input().split()))\n",
    "blist = []\n",
    "\n",
    "for i in alist:\n",
    "    if i % 2 == 0:\n",
    "        blist.append(int(i / 2))\n",
    "    else:\n",
    "        blist.append(int(i ** 2))\n",
    "\n",
    "print(sorted(blist))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 8.打印一定范围内的素数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "给定一个大于2的正整数n，打印出小于n（不包括n且n不大于100）的所有素数。\n",
    "\n",
    "要求将符合条件的输出填入一个列表中，打印的结果为该列表。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，为一个大于2的正整数\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，为一个列表\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "10\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "[2, 3, 5, 7]\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 100\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]\n"
     ]
    }
   ],
   "source": [
    "n = int(input())\n",
    "prime_number = []  # 存放素数\n",
    "\n",
    "for i in range(1, n):\n",
    "    factor = set()  # 利用集合存放因子（集合元素的不重复性）\n",
    "    \n",
    "    # 求因子\n",
    "    for j in range(1, i):\n",
    "        tmp = i // j\n",
    "        \n",
    "        if j > tmp:  # 不用遍历所有来寻找因子\n",
    "            break\n",
    "        elif tmp * j == i:\n",
    "            factor.add(j)\n",
    "            factor.add(tmp)\n",
    "            \n",
    "    # 判断满足素数的条件\n",
    "    if len(factor) == 2:\n",
    "        prime_number.append(i)\n",
    "\n",
    "print(prime_number)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 9.猴子吃桃问题"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "猴子第一天摘下若干个桃子，当即吃了一半，还不过瘾，又多吃了一个第二天早上又将剩下的桃子吃掉一半，又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第n天（<1<n<11）早上想再吃时，见只剩下一个桃子了。求第一天共摘了多少。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，为一个大于1小于11的正整数。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，为一个正整数\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "2\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "4\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 3\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10\n"
     ]
    }
   ],
   "source": [
    "n = int(input())\n",
    "total = 1  # 第 n 天剩下一个桃子\n",
    "\n",
    "for i in range(n-1):\n",
    "    total = (total + 1) * 2\n",
    "\n",
    "print(total)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}